export class Queue {
    constructor() {
        this.items = []
    }
    // - enqueue（element）：向队列尾部添加一个（或多个）新的项。
    enqueue(element) {
        return this.items.push(element)
    }
    // - dequeue：移除队列的第一（即排在队列最前面的）项，并返回被移除的元素。
    dequeue() {
        return this.items.shift()
    }
    // - front：返回队列中第一个元素——最先被添加，也就是最先被移除的元素。队列不做任何变动（不移除元素，只返回元素信息——与Stack类的peek方法非常类似）。
    front() {
        if (this.isEmpty()) return null
        return this.items[0]
    }
    // - isEmpty：如果队列不包含任何元素，返回true，否则返回false。
    isEmpty() {
        return this.items.length === 0
    }
    // - size：返回栈里的元素个数。这个方法和数组的length属性很类似。
    size() {
        return this.items.length
    }
}

// 新建一个装当前包含优先级的元素类
class QueueElement {
    constructor(element, priorty) {
        this.element = element;
        this.priorty = priorty;
    }
}

// 类继承：继承父类的属性和方法，并且可以重新属性和方法
export class PriortyQueue extends Queue {
    enqueue(element, priorty) {
        // 保持一下当前元素
        const queueElement = new QueueElement(element, priorty);
        if (this.isEmpty()) {
            // 如果队列为空，就直接将元素推入队列
            this.items.push(queueElement)
        } else {
            // 否则循环队列，将当前元素与队列元素作比较
            let flag = false; // 做一个标记，判断当前元素是否已经进入队列
            for (let i = 0; i < this.items.length; i++) {
                // 如果当前元素比队列中的排在前面的元素小时，就直接插入到最小的前面
                if (this.items[i].priorty > queueElement.priorty) {
                    this.items.splice(i, 0, queueElement)
                    flag = true; // 这里当前元素已入队列
                    break
                }
            }
            // 如果没有进入队列，就说明比队列中任何一个元素都大，就直接放到队列最后
            if (!flag) {
                this.items.push(queueElement)
            }
        }
    }
}

let queue = new PriortyQueue()
queue.enqueue('aaa', 4)
queue.enqueue('bbb', 1)
queue.enqueue('ccc', 5)
queue.enqueue('ddd', 3)
queue.items.forEach(v => console.log('已进', v));


// 击鼓传花
export function passGame(nameList, num) {
    const queue = new Queue()
    // 遍历数组将元素插入队列
    nameList.forEach(v => queue.enqueue(v))
    // console.log(queue.items);
    // 无限循环判断队列中的长度 >1 就停止
    while (queue.size() > 1) {
        console.log(queue.items);
        // 循环需要出栈的元素下标
        for (let i = 0; i < num - 1; i++) {
            // 将出栈的元素再放入栈中
            queue.enqueue(queue.dequeue())
        }
        // 将排在第一的元素移除
        queue.dequeue()
    }
    // 得到栈中目前的元素
    return queue.front()
}
